package com.doubao.doubao_admin.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doubao.doubao_admin.common.Result;

import com.doubao.doubao_admin.model.dto.CreateTopicDTO;
import com.doubao.doubao_admin.model.entity.BmsPost;
import com.doubao.doubao_admin.model.entity.UmsUser;
import com.doubao.doubao_admin.model.vo.PostVO;

import com.doubao.doubao_admin.service.cService.UmsUserService;
import com.doubao.doubao_admin.service.iService.IBmsPostService;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.Date;
import java.util.List;
import java.util.Map;

import static com.doubao.doubao_admin.utils.JwtUtils.USER_JNAME;

@RestController
@RequestMapping("/post")
public class BmsPostConroller extends BaseController {
    @Resource
    private IBmsPostService iBmsPostService;
    @Resource
    private UmsUserService umsUserService;
    @GetMapping("list")

    /**
     * 多对多的情况：
     * 定义三个实体层对象，分别对应数据库里的三张表
     * VO里添加了一个对象PostVO，因为当前的实体类不够用，所有的属性保留，并添加一个新的对象集合
     *
     * 什么是dto：客户端给我们发过来的请求是一个对象。我们要定义一个与客户端请求相对应的一个对象；
     * 什么是vo：我们要返回给客户端的一个数据，如果说实体层的对象不够用，我们就会相应的定义一个vo
     * 1.这里返回的是一个分页的PostVO，
     * 2.我们不用BmsPost，是因为：
     * 实体层是跟数据库的表一一对应的，BmsPost的信息表里没有tag的信息，tag的信息都在关系表里，
     * 在前端，我们要展示的每一个帖子，都要展示哪一个标签，标签名的信息，
     * 而标签名的信息都在这个实体层跟数据库表对应的BmsPost里不存在，
     * 所以我们得额外定义一个
     * 额外的postVo对象，里面会有一个标签列表，返回给客户端，客户端通过这个列表拿到这篇文章的各个标签的名字，
     * 所以我们最终要返回的是一个PostVO
     */
    public Result<Page<PostVO>> list(@RequestParam(value = "tab",defaultValue = "latest") String tab,
                                     @RequestParam(value = "pageNo",defaultValue = "1") Integer pageNo,
                                     @RequestParam(value = "pageSize",defaultValue = "10") Integer pageSize){

        Page<PostVO> list = (Page<PostVO>) iBmsPostService.getList( new Page<PostVO>(pageNo,pageSize),tab);
        return Result.success(list);
    }

    @RequestMapping(value = "/create", method = RequestMethod.POST)
    public Result<BmsPost> create(@RequestHeader(value = USER_JNAME) String userName
            , @RequestBody CreateTopicDTO dto) {
        UmsUser user = umsUserService.getUserByUsername(userName);
        BmsPost topic = iBmsPostService.create(dto, user);
        return Result.success(topic);
    }
    @GetMapping()
    public Result<Map<String, Object>> view(@RequestParam("id") String id) {
        Map<String, Object> map = iBmsPostService.viewTopic(id);
        return Result.success(map);
    }

    @GetMapping("/recommend")
    public Result<List<BmsPost>> getRecommend(@RequestParam("topicId") String id) {
        List<BmsPost> topics = iBmsPostService.getRecommend(id);
        return Result.success(topics);
    }

    @PostMapping("/update")
    public Result<BmsPost> update(@RequestHeader(value = USER_JNAME) String userName, @Valid @RequestBody BmsPost post) {
        UmsUser umsUser = umsUserService.getUserByUsername(userName);
        Assert.isTrue(umsUser.getId().equals(post.getUserId()), "非本人无权修改");
        post.setModifyTime(new Date());
//        post.setContent(EmojiParser.parseToAliases(post.getContent()));
        iBmsPostService.updateById(post);
        return Result.success(post);
    }

    @DeleteMapping("/delete/{id}")
    public Result<String> delete(@RequestHeader(value = USER_JNAME) String userName, @PathVariable("id") String id) {
        UmsUser umsUser = umsUserService.getUserByUsername(userName);
        BmsPost byId = iBmsPostService.getById(id);
        Assert.notNull(byId, "来晚一步，话题已不存在");
        Assert.isTrue(byId.getUserId().equals(umsUser.getId()), "你为什么可以删除别人的话题？？？");
        iBmsPostService.removeById(id);
        return Result.success(null,"删除成功");
    }
}
